{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "3ac54726",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   种植地块  地块类型  地块面积/亩                                           第一季度可种作物  \\\n",
      "0    A1   平旱地    80.0  黄豆\\n\\n黑豆\\n\\n红豆\\n\\n绿豆\\n\\n爬豆\\n\\n小麦\\n\\n玉米\\n\\n谷子\\n...   \n",
      "1    A2   平旱地    55.0  黄豆\\n\\n黑豆\\n\\n红豆\\n\\n绿豆\\n\\n爬豆\\n\\n小麦\\n\\n玉米\\n\\n谷子\\n...   \n",
      "2    A3   平旱地    35.0  黄豆\\n\\n黑豆\\n\\n红豆\\n\\n绿豆\\n\\n爬豆\\n\\n小麦\\n\\n玉米\\n\\n谷子\\n...   \n",
      "3    A4   平旱地    72.0  黄豆\\n\\n黑豆\\n\\n红豆\\n\\n绿豆\\n\\n爬豆\\n\\n小麦\\n\\n玉米\\n\\n谷子\\n...   \n",
      "4    A5   平旱地    68.0  黄豆\\n\\n黑豆\\n\\n红豆\\n\\n绿豆\\n\\n爬豆\\n\\n小麦\\n\\n玉米\\n\\n谷子\\n...   \n",
      "5    A6   平旱地    55.0  黄豆\\n\\n黑豆\\n\\n红豆\\n\\n绿豆\\n\\n爬豆\\n\\n小麦\\n\\n玉米\\n\\n谷子\\n...   \n",
      "6    B1    梯田    60.0  黄豆\\n\\n黑豆\\n\\n红豆\\n\\n绿豆\\n\\n爬豆\\n\\n小麦\\n\\n玉米\\n\\n谷子\\n...   \n",
      "7    B2    梯田    46.0  黄豆\\n\\n黑豆\\n\\n红豆\\n\\n绿豆\\n\\n爬豆\\n\\n小麦\\n\\n玉米\\n\\n谷子\\n...   \n",
      "8    B3    梯田    40.0  黄豆\\n\\n黑豆\\n\\n红豆\\n\\n绿豆\\n\\n爬豆\\n\\n小麦\\n\\n玉米\\n\\n谷子\\n...   \n",
      "9    B4    梯田    28.0  黄豆\\n\\n黑豆\\n\\n红豆\\n\\n绿豆\\n\\n爬豆\\n\\n小麦\\n\\n玉米\\n\\n谷子\\n...   \n",
      "10   B5    梯田    25.0  黄豆\\n\\n黑豆\\n\\n红豆\\n\\n绿豆\\n\\n爬豆\\n\\n小麦\\n\\n玉米\\n\\n谷子\\n...   \n",
      "11   B6    梯田    86.0  黄豆\\n\\n黑豆\\n\\n红豆\\n\\n绿豆\\n\\n爬豆\\n\\n小麦\\n\\n玉米\\n\\n谷子\\n...   \n",
      "12   B7    梯田    55.0  黄豆\\n\\n黑豆\\n\\n红豆\\n\\n绿豆\\n\\n爬豆\\n\\n小麦\\n\\n玉米\\n\\n谷子\\n...   \n",
      "13   B8    梯田    44.0  黄豆\\n\\n黑豆\\n\\n红豆\\n\\n绿豆\\n\\n爬豆\\n\\n小麦\\n\\n玉米\\n\\n谷子\\n...   \n",
      "14   B9    梯田    50.0  黄豆\\n\\n黑豆\\n\\n红豆\\n\\n绿豆\\n\\n爬豆\\n\\n小麦\\n\\n玉米\\n\\n谷子\\n...   \n",
      "15  B10    梯田    25.0  黄豆\\n\\n黑豆\\n\\n红豆\\n\\n绿豆\\n\\n爬豆\\n\\n小麦\\n\\n玉米\\n\\n谷子\\n...   \n",
      "16  B11    梯田    60.0  黄豆\\n\\n黑豆\\n\\n红豆\\n\\n绿豆\\n\\n爬豆\\n\\n小麦\\n\\n玉米\\n\\n谷子\\n...   \n",
      "17  B12    梯田    45.0  黄豆\\n\\n黑豆\\n\\n红豆\\n\\n绿豆\\n\\n爬豆\\n\\n小麦\\n\\n玉米\\n\\n谷子\\n...   \n",
      "18  B13    梯田    35.0  黄豆\\n\\n黑豆\\n\\n红豆\\n\\n绿豆\\n\\n爬豆\\n\\n小麦\\n\\n玉米\\n\\n谷子\\n...   \n",
      "19  B14    梯田    20.0  黄豆\\n\\n黑豆\\n\\n红豆\\n\\n绿豆\\n\\n爬豆\\n\\n小麦\\n\\n玉米\\n\\n谷子\\n...   \n",
      "20   C1   山坡地    15.0  黄豆\\n\\n黑豆\\n\\n红豆\\n\\n绿豆\\n\\n爬豆\\n\\n小麦\\n\\n玉米\\n\\n谷子\\n...   \n",
      "21   C2   山坡地    13.0  黄豆\\n\\n黑豆\\n\\n红豆\\n\\n绿豆\\n\\n爬豆\\n\\n小麦\\n\\n玉米\\n\\n谷子\\n...   \n",
      "22   C3   山坡地    15.0  黄豆\\n\\n黑豆\\n\\n红豆\\n\\n绿豆\\n\\n爬豆\\n\\n小麦\\n\\n玉米\\n\\n谷子\\n...   \n",
      "23   C4   山坡地    18.0  黄豆\\n\\n黑豆\\n\\n红豆\\n\\n绿豆\\n\\n爬豆\\n\\n小麦\\n\\n玉米\\n\\n谷子\\n...   \n",
      "24   C5   山坡地    27.0  黄豆\\n\\n黑豆\\n\\n红豆\\n\\n绿豆\\n\\n爬豆\\n\\n小麦\\n\\n玉米\\n\\n谷子\\n...   \n",
      "25   C6   山坡地    20.0  黄豆\\n\\n黑豆\\n\\n红豆\\n\\n绿豆\\n\\n爬豆\\n\\n小麦\\n\\n玉米\\n\\n谷子\\n...   \n",
      "26   D1   水浇地    15.0  水稻\\n\\n豇豆\\n\\n刀豆\\n\\n芸豆\\n\\n土豆\\n\\n西红柿\\n\\n茄子\\n\\n菠菜 ...   \n",
      "27   D2   水浇地    10.0  水稻\\n\\n豇豆\\n\\n刀豆\\n\\n芸豆\\n\\n土豆\\n\\n西红柿\\n\\n茄子\\n\\n菠菜 ...   \n",
      "28   D3   水浇地    14.0  水稻\\n\\n豇豆\\n\\n刀豆\\n\\n芸豆\\n\\n土豆\\n\\n西红柿\\n\\n茄子\\n\\n菠菜 ...   \n",
      "29   D4   水浇地     6.0  水稻\\n\\n豇豆\\n\\n刀豆\\n\\n芸豆\\n\\n土豆\\n\\n西红柿\\n\\n茄子\\n\\n菠菜 ...   \n",
      "30   D5   水浇地    10.0  水稻\\n\\n豇豆\\n\\n刀豆\\n\\n芸豆\\n\\n土豆\\n\\n西红柿\\n\\n茄子\\n\\n菠菜 ...   \n",
      "31   D6   水浇地    12.0  水稻\\n\\n豇豆\\n\\n刀豆\\n\\n芸豆\\n\\n土豆\\n\\n西红柿\\n\\n茄子\\n\\n菠菜 ...   \n",
      "32   D7   水浇地    22.0  水稻\\n\\n豇豆\\n\\n刀豆\\n\\n芸豆\\n\\n土豆\\n\\n西红柿\\n\\n茄子\\n\\n菠菜 ...   \n",
      "33   D8   水浇地    20.0  水稻\\n\\n豇豆\\n\\n刀豆\\n\\n芸豆\\n\\n土豆\\n\\n西红柿\\n\\n茄子\\n\\n菠菜 ...   \n",
      "34   E1  普通大棚     0.6  豇豆\\n\\n刀豆\\n\\n芸豆\\n\\n土豆\\n\\n西红柿\\n\\n茄子\\n\\n菠菜 \\n\\n青椒...   \n",
      "35   E2  普通大棚     0.6  豇豆\\n\\n刀豆\\n\\n芸豆\\n\\n土豆\\n\\n西红柿\\n\\n茄子\\n\\n菠菜 \\n\\n青椒...   \n",
      "36   E3  普通大棚     0.6  豇豆\\n\\n刀豆\\n\\n芸豆\\n\\n土豆\\n\\n西红柿\\n\\n茄子\\n\\n菠菜 \\n\\n青椒...   \n",
      "37   E4  普通大棚     0.6  豇豆\\n\\n刀豆\\n\\n芸豆\\n\\n土豆\\n\\n西红柿\\n\\n茄子\\n\\n菠菜 \\n\\n青椒...   \n",
      "38   E5  普通大棚     0.6  豇豆\\n\\n刀豆\\n\\n芸豆\\n\\n土豆\\n\\n西红柿\\n\\n茄子\\n\\n菠菜 \\n\\n青椒...   \n",
      "39   E6  普通大棚     0.6  豇豆\\n\\n刀豆\\n\\n芸豆\\n\\n土豆\\n\\n西红柿\\n\\n茄子\\n\\n菠菜 \\n\\n青椒...   \n",
      "40   E7  普通大棚     0.6  豇豆\\n\\n刀豆\\n\\n芸豆\\n\\n土豆\\n\\n西红柿\\n\\n茄子\\n\\n菠菜 \\n\\n青椒...   \n",
      "41   E8  普通大棚     0.6  豇豆\\n\\n刀豆\\n\\n芸豆\\n\\n土豆\\n\\n西红柿\\n\\n茄子\\n\\n菠菜 \\n\\n青椒...   \n",
      "42   E9  普通大棚     0.6  豇豆\\n\\n刀豆\\n\\n芸豆\\n\\n土豆\\n\\n西红柿\\n\\n茄子\\n\\n菠菜 \\n\\n青椒...   \n",
      "43  E10  普通大棚     0.6  豇豆\\n\\n刀豆\\n\\n芸豆\\n\\n土豆\\n\\n西红柿\\n\\n茄子\\n\\n菠菜 \\n\\n青椒...   \n",
      "44  E11  普通大棚     0.6  豇豆\\n\\n刀豆\\n\\n芸豆\\n\\n土豆\\n\\n西红柿\\n\\n茄子\\n\\n菠菜 \\n\\n青椒...   \n",
      "45  E12  普通大棚     0.6  豇豆\\n\\n刀豆\\n\\n芸豆\\n\\n土豆\\n\\n西红柿\\n\\n茄子\\n\\n菠菜 \\n\\n青椒...   \n",
      "46  E13  普通大棚     0.6  豇豆\\n\\n刀豆\\n\\n芸豆\\n\\n土豆\\n\\n西红柿\\n\\n茄子\\n\\n菠菜 \\n\\n青椒...   \n",
      "47  E14  普通大棚     0.6  豇豆\\n\\n刀豆\\n\\n芸豆\\n\\n土豆\\n\\n西红柿\\n\\n茄子\\n\\n菠菜 \\n\\n青椒...   \n",
      "48  E15  普通大棚     0.6  豇豆\\n\\n刀豆\\n\\n芸豆\\n\\n土豆\\n\\n西红柿\\n\\n茄子\\n\\n菠菜 \\n\\n青椒...   \n",
      "49  E16  普通大棚     0.6  豇豆\\n\\n刀豆\\n\\n芸豆\\n\\n土豆\\n\\n西红柿\\n\\n茄子\\n\\n菠菜 \\n\\n青椒...   \n",
      "50   F1  智慧大棚     0.6  豇豆\\n\\n刀豆\\n\\n芸豆\\n\\n土豆\\n\\n西红柿\\n\\n茄子\\n\\n菠菜 \\n\\n青椒...   \n",
      "51   F2  智慧大棚     0.6  豇豆\\n\\n刀豆\\n\\n芸豆\\n\\n土豆\\n\\n西红柿\\n\\n茄子\\n\\n菠菜 \\n\\n青椒...   \n",
      "52   F3  智慧大棚     0.6  豇豆\\n\\n刀豆\\n\\n芸豆\\n\\n土豆\\n\\n西红柿\\n\\n茄子\\n\\n菠菜 \\n\\n青椒...   \n",
      "53   F4  智慧大棚     0.6  豇豆\\n\\n刀豆\\n\\n芸豆\\n\\n土豆\\n\\n西红柿\\n\\n茄子\\n\\n菠菜 \\n\\n青椒...   \n",
      "\n",
      "                                             第二季度可种作物  \n",
      "0                                                 NaN  \n",
      "1                                                 NaN  \n",
      "2                                                 NaN  \n",
      "3                                                 NaN  \n",
      "4                                                 NaN  \n",
      "5                                                 NaN  \n",
      "6                                                 NaN  \n",
      "7                                                 NaN  \n",
      "8                                                 NaN  \n",
      "9                                                 NaN  \n",
      "10                                                NaN  \n",
      "11                                                NaN  \n",
      "12                                                NaN  \n",
      "13                                                NaN  \n",
      "14                                                NaN  \n",
      "15                                                NaN  \n",
      "16                                                NaN  \n",
      "17                                                NaN  \n",
      "18                                                NaN  \n",
      "19                                                NaN  \n",
      "20                                                NaN  \n",
      "21                                                NaN  \n",
      "22                                                NaN  \n",
      "23                                                NaN  \n",
      "24                                                NaN  \n",
      "25                                                NaN  \n",
      "26                                  大白菜\\n\\n白萝卜\\n\\n红萝卜  \n",
      "27                                  大白菜\\n\\n白萝卜\\n\\n红萝卜  \n",
      "28                                  大白菜\\n\\n白萝卜\\n\\n红萝卜  \n",
      "29                                  大白菜\\n\\n白萝卜\\n\\n红萝卜  \n",
      "30                                  大白菜\\n\\n白萝卜\\n\\n红萝卜  \n",
      "31                                  大白菜\\n\\n白萝卜\\n\\n红萝卜  \n",
      "32                                  大白菜\\n\\n白萝卜\\n\\n红萝卜  \n",
      "33                                  大白菜\\n\\n白萝卜\\n\\n红萝卜  \n",
      "34                            榆黄菇\\n\\n香菇\\n\\n白灵菇\\n\\n羊肚菌  \n",
      "35                            榆黄菇\\n\\n香菇\\n\\n白灵菇\\n\\n羊肚菌  \n",
      "36                            榆黄菇\\n\\n香菇\\n\\n白灵菇\\n\\n羊肚菌  \n",
      "37                            榆黄菇\\n\\n香菇\\n\\n白灵菇\\n\\n羊肚菌  \n",
      "38                            榆黄菇\\n\\n香菇\\n\\n白灵菇\\n\\n羊肚菌  \n",
      "39                            榆黄菇\\n\\n香菇\\n\\n白灵菇\\n\\n羊肚菌  \n",
      "40                            榆黄菇\\n\\n香菇\\n\\n白灵菇\\n\\n羊肚菌  \n",
      "41                            榆黄菇\\n\\n香菇\\n\\n白灵菇\\n\\n羊肚菌  \n",
      "42                            榆黄菇\\n\\n香菇\\n\\n白灵菇\\n\\n羊肚菌  \n",
      "43                            榆黄菇\\n\\n香菇\\n\\n白灵菇\\n\\n羊肚菌  \n",
      "44                            榆黄菇\\n\\n香菇\\n\\n白灵菇\\n\\n羊肚菌  \n",
      "45                            榆黄菇\\n\\n香菇\\n\\n白灵菇\\n\\n羊肚菌  \n",
      "46                            榆黄菇\\n\\n香菇\\n\\n白灵菇\\n\\n羊肚菌  \n",
      "47                            榆黄菇\\n\\n香菇\\n\\n白灵菇\\n\\n羊肚菌  \n",
      "48                            榆黄菇\\n\\n香菇\\n\\n白灵菇\\n\\n羊肚菌  \n",
      "49                            榆黄菇\\n\\n香菇\\n\\n白灵菇\\n\\n羊肚菌  \n",
      "50  豇豆\\n\\n刀豆\\n\\n芸豆\\n\\n土豆\\n\\n西红柿\\n\\n茄子\\n\\n菠菜 \\n\\n青椒...  \n",
      "51  豇豆\\n\\n刀豆\\n\\n芸豆\\n\\n土豆\\n\\n西红柿\\n\\n茄子\\n\\n菠菜 \\n\\n青椒...  \n",
      "52  豇豆\\n\\n刀豆\\n\\n芸豆\\n\\n土豆\\n\\n西红柿\\n\\n茄子\\n\\n菠菜 \\n\\n青椒...  \n",
      "53  豇豆\\n\\n刀豆\\n\\n芸豆\\n\\n土豆\\n\\n西红柿\\n\\n茄子\\n\\n菠菜 \\n\\n青椒...  \n"
     ]
    }
   ],
   "source": [
    "\n",
    "import pandas as pd\n",
    "dikuai_df = pd.read_csv(r'..\\A\\result_df.csv')\n",
    "print(dikuai_df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "3e27e1a1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "    作物编号 作物名称    作物类型                                        种植耕地\n",
      "0      1   黄豆  粮食（豆类）                          平旱地\\n\\n梯田\\n\\n山坡地\\n\n",
      "1      2   黑豆  粮食（豆类）                          平旱地\\n\\n梯田\\n\\n山坡地\\n\n",
      "2      3   红豆  粮食（豆类）                          平旱地\\n\\n梯田\\n\\n山坡地\\n\n",
      "3      4   绿豆  粮食（豆类）                          平旱地\\n\\n梯田\\n\\n山坡地\\n\n",
      "4      5   爬豆  粮食（豆类）                          平旱地\\n\\n梯田\\n\\n山坡地\\n\n",
      "5      6   小麦      粮食                          平旱地\\n\\n梯田\\n\\n山坡地\\n\n",
      "6      7   玉米      粮食                          平旱地\\n\\n梯田\\n\\n山坡地\\n\n",
      "7      8   谷子      粮食                          平旱地\\n\\n梯田\\n\\n山坡地\\n\n",
      "8      9   高粱      粮食                          平旱地\\n\\n梯田\\n\\n山坡地\\n\n",
      "9     10   黍子      粮食                          平旱地\\n\\n梯田\\n\\n山坡地\\n\n",
      "10    11   荞麦      粮食                          平旱地\\n\\n梯田\\n\\n山坡地\\n\n",
      "11    12   南瓜      粮食                          平旱地\\n\\n梯田\\n\\n山坡地\\n\n",
      "12    13   红薯      粮食                          平旱地\\n\\n梯田\\n\\n山坡地\\n\n",
      "13    14   莜麦      粮食                          平旱地\\n\\n梯田\\n\\n山坡地\\n\n",
      "14    15   大麦      粮食                          平旱地\\n\\n梯田\\n\\n山坡地\\n\n",
      "15    16   水稻      粮食                                         水浇地\n",
      "16    17   豇豆  蔬菜（豆类）  水浇地    第一季\\n\\n普通大棚  第一季\\n\\n智慧大棚  第一季、第二季\\n\n",
      "17    18   刀豆  蔬菜（豆类）  水浇地    第一季\\n\\n普通大棚  第一季\\n\\n智慧大棚  第一季、第二季\\n\n",
      "18    19   芸豆  蔬菜（豆类）  水浇地    第一季\\n\\n普通大棚  第一季\\n\\n智慧大棚  第一季、第二季\\n\n",
      "19    20   土豆      蔬菜  水浇地    第一季\\n\\n普通大棚  第一季\\n\\n智慧大棚  第一季、第二季\\n\n",
      "20    21  西红柿      蔬菜  水浇地    第一季\\n\\n普通大棚  第一季\\n\\n智慧大棚  第一季、第二季\\n\n",
      "21    22   茄子      蔬菜  水浇地    第一季\\n\\n普通大棚  第一季\\n\\n智慧大棚  第一季、第二季\\n\n",
      "22    23  菠菜       蔬菜  水浇地    第一季\\n\\n普通大棚  第一季\\n\\n智慧大棚  第一季、第二季\\n\n",
      "23    24   青椒      蔬菜  水浇地    第一季\\n\\n普通大棚  第一季\\n\\n智慧大棚  第一季、第二季\\n\n",
      "24    25   菜花      蔬菜  水浇地    第一季\\n\\n普通大棚  第一季\\n\\n智慧大棚  第一季、第二季\\n\n",
      "25    26   包菜      蔬菜  水浇地    第一季\\n\\n普通大棚  第一季\\n\\n智慧大棚  第一季、第二季\\n\n",
      "26    27  油麦菜      蔬菜  水浇地    第一季\\n\\n普通大棚  第一季\\n\\n智慧大棚  第一季、第二季\\n\n",
      "27    28  小青菜      蔬菜  水浇地    第一季\\n\\n普通大棚  第一季\\n\\n智慧大棚  第一季、第二季\\n\n",
      "28    29   黄瓜      蔬菜  水浇地    第一季\\n\\n普通大棚  第一季\\n\\n智慧大棚  第一季、第二季\\n\n",
      "29    30  生菜       蔬菜  水浇地    第一季\\n\\n普通大棚  第一季\\n\\n智慧大棚  第一季、第二季\\n\n",
      "30    31   辣椒      蔬菜  水浇地    第一季\\n\\n普通大棚  第一季\\n\\n智慧大棚  第一季、第二季\\n\n",
      "31    32  空心菜      蔬菜  水浇地    第一季\\n\\n普通大棚  第一季\\n\\n智慧大棚  第一季、第二季\\n\n",
      "32    33  黄心菜      蔬菜  水浇地    第一季\\n\\n普通大棚  第一季\\n\\n智慧大棚  第一季、第二季\\n\n",
      "33    34   芹菜      蔬菜  水浇地    第一季\\n\\n普通大棚  第一季\\n\\n智慧大棚  第一季、第二季\\n\n",
      "34    35  大白菜      蔬菜                                  水浇地    第二季\n",
      "35    36  白萝卜      蔬菜                                  水浇地    第二季\n",
      "36    37  红萝卜      蔬菜                                  水浇地    第二季\n",
      "37    38  榆黄菇     食用菌                                   普通大棚  第二季\n",
      "38    39   香菇     食用菌                                   普通大棚  第二季\n",
      "39    40  白灵菇     食用菌                                   普通大棚  第二季\n",
      "40    41  羊肚菌     食用菌                                   普通大棚  第二季\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "from typing import List, Tuple, Dict\n",
    "import warnings\n",
    "warnings.filterwarnings('ignore')\n",
    "\n",
    "\n",
    "fujian2_path = r\"..\\data\\附件2.xlsx\"\n",
    "\n",
    "fujian1_path = r\"..\\data\\附件1.xlsx\"\n",
    "\n",
    "fujian2 = pd.read_excel(fujian2_path, sheet_name=None)\n",
    "\n",
    "fujian1 = pd.read_excel(fujian1_path, sheet_name=None)\n",
    "\n",
    "fujian1_sheet2 = fujian1['乡村种植的农作物']\n",
    "fujian1_sheet2 = fujian1_sheet2.iloc[:-4, :-1]\n",
    "fujian1_sheet2 = fujian1_sheet2.ffill()\n",
    "print(fujian1_sheet2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "be5db2af",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dict_keys(['粮食（豆类）', '粮食', '蔬菜（豆类）', '蔬菜', '食用菌'])\n",
      "[[1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2]]\n"
     ]
    }
   ],
   "source": [
    "# 数据预处理和参数定义\n",
    "def preprocess_data():\n",
    "    # 收集各类别作物集合\n",
    "    crops = {}\n",
    "    crop_types = fujian1_sheet2['作物类型'].unique().tolist()\n",
    "    for crop_type in crop_types:\n",
    "        crops[crop_type] = fujian1_sheet2[fujian1_sheet2['作物类型'] == crop_type]['作物名称'].tolist()\n",
    "    return crops\n",
    "\n",
    "# 预处理数据\n",
    "data_dict = preprocess_data()\n",
    "print(data_dict.keys())\n",
    "\n",
    "# 索引 i\n",
    "dikuai = dikuai_df['种植地块'].unique().tolist()\n",
    "\n",
    "dikuai_type = [dikuai_df[dikuai_df['种植地块'] == land]['地块类型'].iloc[0] for land in dikuai]\n",
    "\n",
    "# 索引 j\n",
    "j_crops = fujian1_sheet2['作物名称'].unique().tolist()\n",
    "\n",
    "j_grain = data_dict.get('粮食', []) + data_dict.get('粮食（豆类）', [])\n",
    "\n",
    "j_vegetable = data_dict.get('蔬菜', []) + data_dict.get('蔬菜（豆类）', [])\n",
    "\n",
    "\n",
    "j_fungus = data_dict.get('食用菌', [])\n",
    "\n",
    "# print(len(j_crops), len(j_grain), len(j_vegetable), len(j_fungus))\n",
    "assert(sorted(j_crops) == sorted(j_grain + j_vegetable + j_fungus))\n",
    "\n",
    "j_legume = data_dict.get('粮食（豆类）', []) + data_dict.get('蔬菜（豆类）', [])\n",
    "\n",
    "# 索引 s\n",
    "seasons_i = [[1] if dikuai_type[i] in ['平旱地', '梯田', '山坡地'] else [1, 2] for i in range(len(dikuai))]\n",
    "\n",
    "eps_area = 0.1 # 要调整\n",
    "\n",
    "M = 1e6 # 要调整\n",
    "\n",
    "# print(j_legume)\n",
    "# print(dikuai_type)\n",
    "print(seasons_i)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "4fd83f36",
   "metadata": {},
   "outputs": [],
   "source": [
    "import math\n",
    "class GA_TSP:\n",
    "    \"\"\"遗传算法求解TSP问题类\"\"\"\n",
    "    \n",
    "    def __init__(self, cities: np.ndarray, max_gen: int = 500,\n",
    "                 pop_size: int = 200, cross_rate: float = 0.8,\n",
    "                 muta_rate: float = 0.005) -> None:\n",
    "        self.dist_mat: Optional[np.ndarray] = None\n",
    "        self.max_gen: int = max_gen  # 最大进化次数\n",
    "        self.pop_size: int = pop_size  # 种群大小（个体个数）\n",
    "        self.cross_rate: float = cross_rate  # 交叉概率\n",
    "        self.muta_rate: float = muta_rate  # 变异概率\n",
    "        self.cities: np.ndarray = cities  # 城市的坐标数据\n",
    "        self.cities_num: int = cities.shape[0]  # 城市的个数(个体的染色体长度)\n",
    "        self.population: List[np.ndarray] = []  # 种群\n",
    "        self.new_pop: List[np.ndarray] = []  # 新种群\n",
    "        self.dis: List[float] = []  # 每个个体的距离\n",
    "        self.fitness: List[float] = []  # 每个个体的适应度\n",
    "        self.index: int = 0  # 最优个体索引\n",
    "\n",
    "    # 获得距离矩阵\n",
    "    def gen_dist_mat(self) -> None:\n",
    "        D = self.cities\n",
    "        city_cnt = self.cities_num\n",
    "        dist_mat = np.zeros((city_cnt, city_cnt))\n",
    "        for i in range(city_cnt):\n",
    "            for j in range(city_cnt):\n",
    "                if i == j:\n",
    "                    # 相同城市不允许访问\n",
    "                    dist_mat[i][j] = 1000000\n",
    "                else:\n",
    "                    # 单位：km\n",
    "                    dist_mat[i][j] = 6378.14 * math.acos(\n",
    "                        math.cos(D[i][1]) * math.cos(D[j][1]) * math.cos(D[i][0] - D[j][0]) +\n",
    "                        math.sin(D[i][1]) * math.sin(D[j][1]))\n",
    "        self.dist_mat = dist_mat\n",
    "\n",
    "    # 计算路径长度\n",
    "    def dis_cal(self, path: np.ndarray) -> float:\n",
    "        \"\"\"\n",
    "        适应度函数，计算目标函数值.\n",
    "        :param path: 一个解\n",
    "        :return: 目标函数值，即总距离\n",
    "        \"\"\"\n",
    "        distance: float = 0.0\n",
    "        if self.dist_mat is None:\n",
    "            raise ValueError(\"距离矩阵未初始化，请先调用gen_dist_mat()方法\")\n",
    "        \n",
    "        for i in range(len(path) - 1):\n",
    "            distance += float(self.dist_mat[path[i]][path[i + 1]])\n",
    "        distance += float(self.dist_mat[path[-1]][path[0]])  # 从最后一个城市回到出发城市\n",
    "        return distance\n",
    "\n",
    "    # 初始化种群\n",
    "    def init_population(self) -> None:\n",
    "        path: np.ndarray = np.array(range(self.cities_num))\n",
    "        self.population = []\n",
    "        for i in range(self.pop_size):\n",
    "            x: np.ndarray = path.copy()\n",
    "            np.random.shuffle(x)  # 随机洗牌\n",
    "            self.population.append(x)\n",
    "\n",
    "    # 自然选择，种群根据适应度进行更新\n",
    "    def select(self) -> None:\n",
    "        # 计算每条路径的长度，放入列表\n",
    "        self.dis = []\n",
    "        for i in range(self.pop_size):\n",
    "            self.dis.append(self.dis_cal(path=self.population[i]))\n",
    "        # 根据路径长度计算每个个体的适应度\n",
    "        self.fitness = []\n",
    "        for i in range(self.pop_size):\n",
    "            self.fitness.append(1 / (self.dis[i] ** 15))\n",
    "        # 适应度总和\n",
    "        fitness_sum: float = 0.0\n",
    "        for i in range(self.pop_size):\n",
    "            fitness_sum += self.fitness[i]\n",
    "        # 根据适应度进行选择，适应度大的被选择概率大\n",
    "        fitness_probs: np.ndarray = np.array(self.fitness) / fitness_sum\n",
    "        idx: np.ndarray = np.random.choice(np.arange(self.pop_size), size=self.pop_size, replace=True,\n",
    "                               p=fitness_probs)\n",
    "        self.new_pop = []\n",
    "        for i in idx:\n",
    "            self.new_pop.append(self.population[i])\n",
    "        self.population = self.new_pop\n",
    "\n",
    "    # 交叉互换\n",
    "    def crossover(self) -> None:\n",
    "        self.new_pop = []\n",
    "        for father in self.population:\n",
    "            child: np.ndarray = father  # 初步让子代获得父本染色体\n",
    "            if np.random.rand() < self.cross_rate:\n",
    "                # 随机选择一个染色体作为母本\n",
    "                mother_index: int = np.random.randint(0, self.pop_size)\n",
    "                mother: np.ndarray = self.population[mother_index]\n",
    "                # 确定切割点     \n",
    "                left: int = np.random.randint(0, self.cities_num - 2)\n",
    "                right: int = np.random.randint(left + 1, self.cities_num - 1)\n",
    "                mother_list: List[int] = mother.tolist()\n",
    "                father_list: List[int] = father.tolist()\n",
    "                # 切割片段\n",
    "                gene: List[int] = mother_list[left:right]\n",
    "                child1_c: List[int] = father_list[right:] + father_list[:right]\n",
    "                child1: List[int] = child1_c.copy()\n",
    "                # 去除父本中母本出现过的重复基因\n",
    "                for o in gene:\n",
    "                    child1_c.remove(o)\n",
    "                child1[left:right] = gene # 先填母本基因\n",
    "                child1[right:] = child1_c[0:len(child1) - right] # 顺序填充父本中不重复的基因\n",
    "                child1[:left] = child1_c[(len(child1) - right):]\n",
    "                child = np.array(child1) # 再转为 np 对象\n",
    "\n",
    "            self.new_pop.append(child)\n",
    "        self.population = self.new_pop\n",
    "\n",
    "    # 变异\n",
    "    def mutation(self) -> None:\n",
    "        for i in range(self.pop_size):\n",
    "            if np.random.rand() < self.muta_rate:\n",
    "                child: np.ndarray = self.population[i]\n",
    "                u: int = np.random.randint(0, self.cities_num - 2)\n",
    "                v: int = np.random.randint(u + 1, self.cities_num - 1)\n",
    "                child_x: np.ndarray = child[u + 1:v]\n",
    "                # 翻转变异\n",
    "                child_x = child_x[::-1]\n",
    "                child = np.concatenate((child[0:u + 1], child_x, child[v:]))\n",
    "                self.population[i] = child\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9f292d31",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
